Improves wait time when writing test you expect to fail

- reduces default wait time from 60 seconds to 2 seconds
- makes use of Capybara's built in polling negative matchers to increase test stability
- adds a helper method to take a screenshot and open it to help understand what's happening in a test

Will Read 8 年之前
父節點
當前提交
771afe9cdf

+ 2 - 1
Gemfile

@@ -142,9 +142,10 @@ group :development do
142 142
 
143 143
   group :test do
144 144
     gem 'coveralls', require: false
145
+    gem 'capybara-select2', require: false
145 146
     gem 'delorean'
147
+    gem 'launchy', require: false
146 148
     gem 'poltergeist'
147
-    gem 'capybara-select2', require: false
148 149
     gem 'pry-rails'
149 150
     gem 'rr'
150 151
     gem 'rspec', '~> 3.2'

+ 1 - 0
Gemfile.lock

@@ -627,6 +627,7 @@ DEPENDENCIES
627 627
   jsonpath (~> 0.5.6)
628 628
   kaminari (~> 0.16.1)
629 629
   kramdown (~> 1.3.3)
630
+  launchy
630 631
   letter_opener_web
631 632
   liquid (~> 3.0.3)
632 633
   listen (~> 3.0.5)

+ 4 - 2
spec/capybara_helper.rb

@@ -2,16 +2,18 @@ require 'rails_helper'
2 2
 require 'capybara/rails'
3 3
 require 'capybara/poltergeist'
4 4
 require 'capybara-select2'
5
+require 'helpers/capybara_poltergeist_screenshot'
5 6
 
6 7
 Capybara.register_driver :poltergeist do |app|
7
-  Capybara::Poltergeist::Driver.new(app, timeout: 60)
8
+  Capybara::Poltergeist::Driver.new(app, timeout: 2)
8 9
 end
9 10
 
10 11
 Capybara.javascript_driver = :poltergeist
11
-Capybara.default_max_wait_time = 60
12
+Capybara.default_max_wait_time = 2
12 13
 
13 14
 RSpec.configure do |config|
14 15
   config.include Warden::Test::Helpers
16
+  config.include Capybara::PoltergeistScreenshot
15 17
   config.before :suite do
16 18
     Warden.test_mode!
17 19
   end

+ 4 - 4
spec/features/admin_users_spec.rb

@@ -22,7 +22,7 @@ describe Admin::UsersController do
22 22
       visit admin_users_path
23 23
       find(:css, "a[href='/admin/users/#{users(:bob).id}']").click
24 24
       expect(page).to have_text("User 'bob' was deleted.")
25
-      expect(page).not_to have_text('bob@example.com')
25
+      expect(page).to have_no_text('bob@example.com')
26 26
     end
27 27
 
28 28
     context "creating new users" do
@@ -82,12 +82,12 @@ describe Admin::UsersController do
82 82
     context "(de)activating users" do
83 83
       it "does not show deactivation buttons for the current user" do
84 84
         visit admin_users_path
85
-        expect(page).not_to have_css("a[href='/admin/users/#{users(:jane).id}/deactivate']")
85
+        expect(page).to have_no_css("a[href='/admin/users/#{users(:jane).id}/deactivate']")
86 86
       end
87 87
 
88 88
       it "deactivates an existing user" do
89 89
         visit admin_users_path
90
-        expect(page).not_to have_text('inactive')
90
+        expect(page).to have_no_text('inactive')
91 91
         find(:css, "a[href='/admin/users/#{users(:bob).id}/deactivate']").click
92 92
         expect(page).to have_text('inactive')
93 93
         users(:bob).reload
@@ -98,7 +98,7 @@ describe Admin::UsersController do
98 98
         users(:bob).deactivate!
99 99
         visit admin_users_path
100 100
         find(:css, "a[href='/admin/users/#{users(:bob).id}/activate']").click
101
-        expect(page).not_to have_text('inactive')
101
+        expect(page).to have_no_text('inactive')
102 102
         users(:bob).reload
103 103
         expect(users(:bob)).to be_active
104 104
       end

+ 1 - 1
spec/features/create_an_agent_spec.rb

@@ -13,4 +13,4 @@ describe "Creating a new agent", js: true do
13 13
 
14 14
     expect(page).to have_text("Test Trigger Agent")
15 15
   end
16
-end
16
+end

+ 12 - 0
spec/helpers/capybara_poltergeist_screenshot.rb

@@ -0,0 +1,12 @@
1
+require 'launchy'
2
+
3
+module Capybara
4
+  module PoltergeistScreenshot
5
+    def screenshot_and_open_image(full: false)
6
+      timestamp = Time.now.strftime('%Y-%m-%d-%H-%M-%S')
7
+      screenshot_path = "tmp/capybara/screenshot_#{timestamp}_#{SecureRandom.hex}.png"
8
+      page.save_screenshot(screenshot_path, full: full)
9
+      Launchy.open screenshot_path
10
+    end
11
+  end
12
+end